--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Examples/Broadcast.py b6bfd1655cbcda3c3da5389f0ed2a7b9f7db959b (b6bfd165) Text, 3.63 KB
T8b949e##########################################################
T8b949e# This RNS example demonstrates broadcasting unencrypted #
T8b949e# information to any listening destinations. #
T8b949e##########################################################
Tff7b72import T7ee787sys
Tff7b72import T7ee787argparse
Tff7b72import T7ee787RNS
T8b949e# Let's define an app name. We'll use this for all
T8b949e# destinations we create. Since this basic example
T8b949e# is part of a range of example utilities, we'll put
T8b949e# them all within the app namespace "example_utilities"
Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffexample_utilitiesTa5d6ff"
T8b949e# This initialisation is executed when the program is started
Tff7b72def Td2a8ffprogram_setupTb4b4b4(Te6edf3configpathTb4b4b4, Te6edf3channelTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e# We must first initialise Reticulum
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configpathTb4b4b4)
T8b949e# If the user did not select a "channel" we use
T8b949e# a default one called "public_information".
T8b949e# This "channel" is added to the destination name-
T8b949e# space, so the user can select different broadcast
T8b949e# channels.
Tff7b72if Te6edf3channel Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3channel Tff7b72= Ta5d6ff"Ta5d6ffpublic_informationTa5d6ff"
T8b949e# We create a PLAIN destination. This is an uncencrypted endpoint
T8b949e# that anyone can listen to and send information to.
Te6edf3broadcast_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Tff7b72NoneTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAINTb4b4b4,
Te6edf3APP_NAMETb4b4b4,
Ta5d6ff"Ta5d6ffbroadcastTa5d6ff"Tb4b4b4,
Te6edf3channel
Tb4b4b4)
T8b949e# We specify a callback that will get called every time
T8b949e# the destination receives data.
Te6edf3broadcast_destinationTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Te6edf3packet_callbackTb4b4b4)
T8b949e# Everything's ready!
T8b949e# Let's hand over control to the main loop
Te6edf3broadcastLoopTb4b4b4(Te6edf3broadcast_destinationTb4b4b4)
Tff7b72def Td2a8ffpacket_callbackTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
T8b949e# Simply print out the received data
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffReceived data: Ta5d6ff"Tff7b72+Te6edf3dataTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Tffea00\rTffea00\nTa5d6ff> Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffbroadcastLoopTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4:
T8b949e# Let the user know that everything is ready
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6ff"Ta5d6ffBroadcast example Ta5d6ff"Tff7b72+
Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+
Ta5d6ff"Ta5d6ff running, enter text and hit enter to broadcast (Ctrl-C to quit)Ta5d6ff"
Tb4b4b4)
T8b949e# We enter a loop that runs until the users exits.
T8b949e# If the user hits enter, we will send the information
T8b949e# that the user entered into the prompt.
Tff7b72while Tff7b72TrueTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff> Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3entered Tff7b72= Tffa657inputTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3entered Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3enteredTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
T8b949e##########################################################
T8b949e#### Program Startup #####################################
T8b949e##########################################################
T8b949e# This part of the program gets run at startup,
T8b949e# and parses input from the user, and then starts
T8b949e# the program.
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(
Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffReticulum example demonstrating sending and receiving broadcastsTa5d6ff"
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4,
Tffa657typeTff7b72=Tffa657str
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff--channelTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffbroadcast channel nameTa5d6ff"Tb4b4b4,
Tffa657typeTff7b72=Tffa657str
Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4:
Te6edf3configarg Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfig
Tff7b72elseTb4b4b4:
Te6edf3configarg Tff7b72= Tff7b72None
Tff7b72if Te6edf3argsTff7b72.Td2a8ffchannelTb4b4b4:
Te6edf3channelarg Tff7b72= Te6edf3argsTff7b72.Td2a8ffchannel
Tff7b72elseTb4b4b4:
Te6edf3channelarg Tff7b72= Tff7b72None
Te6edf3program_setupTb4b4b4(Te6edf3configargTb4b4b4, Te6edf3channelargTb4b4b4)
Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff0Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────